#include "head.h"
/* Usage:  */
int pipefd[2];
void func(int num)
{
    write(pipefd[1], "1", 1);
    printf("pipefd[1] \n");
}
int main(void){                                  
    // 管道要加在 fork父进程之前 不然二号信号无法触发读取
    pipe(pipefd);
    if(fork() != 0)
    {
        // 父进程
        signal(2, func);


        wait(NULL);
        printf("子进程退出 \n");
        exit(0);
    }

    // 子进程脱离前台进程组
    setpgid(0, 0);

    // 初始化参数
    // 同时创建子线程
    status_t status;
    initStatus(&status, 4);
    // 初始化socket_fd对象和IP地址与端口
    int socket_fd;
    initSocket(&socket_fd, "8080", "192.168.229.128");
    // 创建epoll对象
    int epoll_fd = epoll_create(1);
    addEpoll(epoll_fd, socket_fd);


    // 监听管道的读端
    addEpoll(epoll_fd ,pipefd[0]);
    while(1)
    {
        // 就绪集合
        struct epoll_event list[10];
        int epoll_num = epoll_wait(epoll_fd, list, 10, -1);
        ERROR_CHECK(epoll_num, -1, "epoll_wait");
        for(int i=0; i<epoll_num; i++)
        {
            int fd = list[i].data.fd;
            if(fd == socket_fd)
            {
                // 有新链接进来
                int net_fd = accept(socket_fd, NULL, NULL);
                ERROR_CHECK(net_fd, -1, "accept");
                // 共享资源
                pthread_mutex_lock(&status.lock);
                enQueue(&status.queue, net_fd);
                pthread_cond_broadcast(&status.cond);
                pthread_mutex_unlock(&status.lock);
            }else if(fd == pipefd[0])
            {
                printf("信号触发 \n");
                // 管道可读，父进程捕捉函数发送信号，父进程捕捉到
                // 要求子进程退出
                char buf[60] = { 0 };
                read(pipefd[0], buf, sizeof(buf));

                // 要求子进程依次退出 

                for(int j=0; j<4; j++)
                {
                    pthread_cancel(status.list[j]);
                }
                for(int k=0; k<4; k++)
                {
                    pthread_join(status.list[k], NULL);
                }

                // 子线程退出以后，主线程也退出
                printf("子线程已全部退出，主线程也退出 \n");
                pthread_exit(NULL);
            }
        }
    }
    return 0;
}


